package top.lishuoboy.cors.controller;

import cn.hutool.core.date.DateUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/* 4.跨域单个配置方式-SpringMvc */
@Slf4j
@RestController
@RequestMapping("/ajax")
public class AjaxController {

    /**
     * <h2>【4.跨域单个配置方式-SpringMvc ：添加 @CrossOrigin注解，设置origins等响应头参数（只对SpringMvc写法生效，对原生Servlet不生效）】</h2>
     * <h3>【4种跨域实现方式 及 优先级（从高到低）】https://blog.csdn.net/lishuoboy/article/details/141123142</h3>
     * <div> 1.跨域全局配置方式-Filter(全适用)：重写 Filter.doFilter()，设置 res.setHeader("Access-Control-Allow-Origin", "*") 等响应头参数</div>
     * <div> 2.跨域全局配置方式-SpringMvc    ：重写 WebMvcConfigurer.addCorsMappings()，设置 registry.addMapping("/**").allowedOrigins("*")等响应头参数（只对SpringMvc写法生效，对原生Servlet不生效）</div>
     * <div> 3.跨域单个配置方式-WebServlet   ：设置 res.addHeader("Access-Control-Allow-Origin", "*") 等响应头参数</div>
     * <div> 4.跨域单个配置方式-SpringMvc    ：添加 @CrossOrigin注解，设置origins等响应头参数（只对SpringMvc写法生效，对原生Servlet不生效）</div>
     * <h3>【其他参考文章】</h3>
     * <div> 1. @CrossOrigin详细参数说明 https://www.jb51.net/program/305133q17.htm</div>
     * <div> 2. SpringBoot处理跨域请求的四种方法 https://www.jb51.net/program/30726178v.htm</div>
     */
//    @CrossOrigin(
//        // origins 和 originPatterns取并集。【注意】此处配置与下面的res.setHeader()功能相同，优先级较低。二选其一即可
//        origins = {"http://localhost:63342", "*"},                                  //【跨域配置】[必需]               允许请求源  ：默认值为"*"，即允许所有。相当于res.setHeader("Access-Control-Allow-Origin", )
//        originPatterns = {"http://localhost:63342", "http://*", "*"},               //【跨域配置】[必需]               允许请求源  ：默认值为"*"，即允许所有。相当于res.setHeader("Access-Control-Allow-Origin", )
//        methods = {RequestMethod.GET, RequestMethod.PUT},                           //【跨域配置】[有复杂请求方法时必需]  允许请求方法：默认值为（优先以@RequestMapping的method属性为准，如果没有指定则默认为"GET,POST,HEAD）。相当于res.setHeader("Access-Control-Allow-Methods", )
//        allowedHeaders = {"My-Name", "*"},                                          //【跨域配置】[有复杂请求头时必需]    允许请求头 ：默认值为"*"，即允许所有。相当于res.setHeader("Access-Control-Allow-Headers", )
//        maxAge = 5                                                                  //【跨域配置】[非必需]             预检缓存时长：默认值 1800秒。小于等于0时缓存无效【注意浏览器不要禁用缓存，否则不生效】 。相当于res.setHeader("Access-Control-Max-Age", )
//    )
    @RequestMapping(value = "/CrossOrigin")
    @SneakyThrows
    void ajax(HttpServletRequest req, HttpServletResponse res) {
        log.warn("method==【{}】, name==【{}】, header.origin==【{}】, Access-Control-Request-Method==【{}】, Access-Control-Request-Headers==【{}】", req.getMethod(), req.getParameter("name"), req.getHeader("Origin"), req.getHeader("Access-Control-Request-Method"), req.getHeader("Access-Control-Request-Headers"));

//        res.setHeader("Access-Control-Allow-Origin", req.getHeader("Origin"));                                  //【跨域配置】[必需]               允许请求源  ：默认值 无，配置"*"允许所有。

        res.getWriter().write(DateUtil.now() + "@" + req.getMethod());
    }

    /**
     * 【4.跨域单个配置方式-SpringMvc-复杂请求的预检请求】
     * SpringMvc将预检请求拦截了，并不会执行到这里。（会拦截请求头同时带有 Origin、Access-Control-Request-Method 的，即使为空串，只要不是null就行）
     */
    /*@RequestMapping(value = "/CrossOrigin", method = RequestMethod.OPTIONS)
    void ajax(HttpServletRequest req) {
        // SpringMvc将预检请求拦截了，并不会执行到这里。（会拦截请求头同时带有Origin、Access-Control-Request-Method的）
        log.warn("method==【{}】, name==【{}】, header.origin==【{}】, Access-Control-Request-Method==【{}】, Access-Control-Request-Headers==【{}】", req.getMethod(), req.getParameter("name"), req.getHeader("Origin"), req.getHeader("Access-Control-Request-Method"), req.getHeader("Access-Control-Request-Headers"));
    }*/
}
